// proxy  代理对象
// 监视对象的读写

// Object.defineProperty

// const person = {
//     name: 'zce',
//     age: 20
// }

// // Vue 3.0开始 使用Proxy
// const personProxy = new Proxy(person,{
//     get (target,property) {
//         return property in target ? target[property] : 'default'  //如果访问的对象不存在 使用默认属性
//         // console.log(target,property)
//         // return 100
//     }, 
//     // 监听属性的 访问  参数一 代理目标对象  参数二  外部访问的属性名
//     set (target,property,val) {
//         // 设置校验 例如 
//         if (property === 'age') {
//             if (!Number.isInteger(val)){
//                 throw new TypeError (`${val} is not an number`)
//             }
//         }
//         target[property] = val
//         // console.log(target,property,val)
//     }  
//     // 监听属性的 设置  参数一 代理目标对象  参数二  外部修改的属性名  参数三 修改的值
    
// })  
// // 参数一  代理的对象  参数二 ，代理的处理对象
// // personProxy.gender = true
// personProxy.age = 'qwe'  //报错 
// personProxy.age = 28
// // console.log(personProxy.name)

// console.log(personProxy.age)




// const person = {
//     name: 'zce',
//     age: 20
// }

// const personProxy = new Proxy(person,{
//     deleteProperty (target, property) {
//         console.log('delete',property)
//         delete target[property]
//     }
//     //监听 delete操作  参数一 代理目标对象  参数二 要删除属性名称
// })
// delete personProxy.age
// console.log(person)


// get  读取某个属性
// set  写入某个属性
// has  in操作符 
// deleteProperty   delete操作符
// getPrototypeof   Object.getPrototypeof()
// setPrototypeof   Object.setPrototypeof()
// isExtensible     Object.isExtensible()
// preventExtensions   Object.preventExtensions()
// getOwnPropertyDescriptor    Object.getOwnPropertyDescriptor()
// definProperty    Object.definProperty()
// ownKeys          Object.getOwnPropertyNames()、object.getOwnPropertySymbols()
// apply            调用一个函数
// construct        用 new 调用一个函数


// --------------------------------------------

// const list = []
// const listProxy = new Proxy(list,{
//     set (target,property,value) {
//         console.log('set',property,value)
//         target[property] = value
//         return true 
//     }
// })

// listProxy.push(100) 



// Proxy 相比 defineProperty要更强大

// defineProperty 只能监视属性的读写
// Proxy 能够监视到更多对象操作  例如 delete操作   更好的支持数组对象的监视 
// Proxy 非侵入的方式监管对象的读写 


// const person = {}
// Object.defineProperty(person,'name',{
//     get () {
//         console.log('name 被访问')
//         return person._name
//     },
//     set (value) {
//         console.log('name 被设置')
//         person._name = value
//     }
// })

// Object.defineProperty(person,'age',{
//     get () {
//         console.log('age 被访问')
//         return person._age
//     },
//     set (value) {
//         console.log('age 被设置')
//         person._age = value
//     }
// })

// person.name = 'jack'
// console.log(person.name)